package zw_1_100.zw_14_最长公共前缀;

/**
 * 编写一个函数来查找字符串数组中的最长公共前缀。
 *
 * 如果不存在公共前缀，返回空字符串 ""。
 *
 *  
 *
 * 示例 1：
 *
 * 输入：strs = ["flower","flow","flight"]
 * 输出："fl"
 * 示例 2：
 *
 * 输入：strs = ["dog","racecar","car"]
 * 输出：""
 * 解释：输入不存在公共前缀。
 *  
 *
 * 提示：
 *
 * 1 <= strs.length <= 200
 * 0 <= strs[i].length <= 200
 * strs[i] 仅由小写英文字母组成
 *
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode.cn/problems/longest-common-prefix
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 */


class Solution {

    public static void main(String[] args) {
//        String[] strs = {"flower","flow","flight"};
//        String[] strs = {"dog","racecar","car"};
        String[] strs = {"ab", "a"};
        String s = longestCommonPrefix(strs);
        System.out.println(s);
    }

    /**
     * 直接sort字符串数组，字典序列排序，然后比较第一个和最后一个字符串即可，其他字符串可以不用比较。
     * 缺点是排序的时间复杂度可能会比较高，正常排序是（NlogN），对字符串数组排序可能还要乘以一个字符串的平均长度
     * @param strs
     * @return
     */
//    public static String longestCommonPrefix(String[] strs) {
//        Arrays.sort(strs);
//        char[] first = strs[0].toCharArray();
//        char[] last = strs[strs.length - 1].toCharArray();
//        int i = 0;
//        while (i < first.length && i < last.length) {
//            if (first[i] != last[i]) {
//                break;
//            }
//            i ++;
//        }
//        return strs[0].substring(0, i);
//    }

    /**
     * 通过 1 ms	39.3 MB	Java
     * @param strs
     * @return
     */
//    public static String longestCommonPrefix(String[] strs) {
//        if (strs.length == 0) return "";
//        // 初始值为首位元素
//        String res = strs[0];
//        for (int i = 1; i < strs.length; i++) {
//            int j = 0;
//            // 挨着对比
//            while (j < res.length() && j < strs[i].length() && res.charAt(j) == strs[i].charAt(j)) {
//                j++;
//            }
//            // substring 是左闭右开的
//            res = res.substring(0, j);
//        }
//        return res;
//    }


    /**
     * 自己做的
     * 通过 1 ms	39.8 MB	Java
     * @param strs
     * @return
     */
    public static String longestCommonPrefix(String[] strs) {
        if (strs.length == 1){
            return strs[0];
        }
        StringBuilder p = new StringBuilder();
        String s = strs[0];
        for (int i = 0; i < s.length(); i++) {
            for (int j = 1; j < strs.length; j++) {
                String str = strs[j];
                if (str.length() - 1 < i || str.charAt(i) != s.charAt(i)) {
                    return p.toString();
                }
            }
            p = p.append(s.charAt(i));
        }
        return p.toString();
    }

}
